<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="2">返回值调用说明</th>
		</tr> 
		<tr> 
			<th width="30%">说明</th>
			<th width="70%">示例</th>
		</tr> 
	</thead> 
	<tbody> 
		<tr> 
			<td>布局类型为'默认页'或'更多'的返回值可以直接调用</td>
			<td align="left">
				<textarea name="exampleCode">
					<#-- '默认页'修改会员返回值调用 -->
					${user.userName}
				</textarea>
			</td>
		<tr> 
		<tr> 
			<td>布局类型为'更多'的返回值和'默认页'更多的返回值相同</td>
			<td align="left">
				<textarea name="exampleCode" >
					<#-- 默认页在线帮助'更多'的返回值变量 -->
					more_help_page
					
					<#-- 布局添加在线帮助'更多'的返回值变量 -->
					more_help_page
				</textarea>
			</td>
		<tr> 
		<tr> 
			<td>'布局 -- 版块'的调用方式为'引用代码'时,版块代码块必须由&lt@function>&lt/@function>标签包裹</td>
			<td>
				<textarea name="exampleCode" >
					&lt@function>
						版块返回对象
						例如【评论列表】【分页】${topicRelated_comment_page.totalpage}
					&lt/@function>
				</textarea>
			</td>
		<tr> 
			<td>'布局 -- 版块'的调用方式为'调用对象'时,对象代码块必须由&lt@object action="">&lt/@object>标签包裹</td>
			<td>
				<textarea name="exampleCode" >
					action参数的值由系统自动生成
					&lt@object action="${topicRelated_tag_1}">
						版块返回对象
						例如【标签列表】【集合】
						&lt#list topicRelated_tag_collection as tag>
							标签名称：${tag.name}
						&lt/#list>
					&lt/@object>
				</textarea>
			</td>
		</tr>
		<tr> 
			<td>'布局 -- 版块'的调用方式为'引用代码'时,引入本代码块的标签为&lt@include action=""/></td>
			<td>
				<textarea name="exampleCode" >
					action参数的值由系统自动生成
					引入【标签】版块
					&lt@include action="${topicRelated_tag_1}"/>
				</textarea>
			</td>
		</tr>
	</tbody> 
</table>
<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">公共对象</th>
		</tr> 
		<tr> 
			<th width="30%">变量</th>
			<th width="30%">类型</th>
			<th width="40%">说明</th> 
		</tr> 
	</thead> 
	<tbody> 
		<tr> 
			<td>baseURL</td>
			<td>String</td>
			<td>系统路径</td>
		</tr>
		<tr> 
			<td>commonPath</td>
			<td>String</td>
			<td>资源路径</td>
		</tr>
		<tr> 
			<td>contextPath</td>
			<td>String</td>
			<td>系统虚拟目录</td>
		</tr>
		<tr> 
			<td>suffix</td>
			<td>String</td>
			<td>站点后缀名</td>
		</tr>
		<tr> 
			<td>templateDir</td>
			<td>String</td>
			<td>模板目录名称</td>
		</tr>
		<tr> 
			<td>title</td>
			<td>String</td>
			<td>站点名称</td>
		</tr>
		<tr> 
			<td>keywords</td>
			<td>String</td>
			<td>站点关键词</td>
		</tr>
		<tr> 
			<td>description</td>
			<td>String</td>
			<td>站点描述</td>
		</tr>
		<tr> 
			<td>systemUser</td>
			<td><a style="color: #317ee7" onclick="anchorJump('#anchor_40'); return false;">AccessUser</a></td>
			<td>登录用户</td>
		</tr>
		<tr> 
			<td>baseURI</td>
			<td>String</td>
			<td>系统资源标识符</td>
		</tr>
		<tr> 
			<td>token</td>
			<td>String</td>
			<td>令牌</td>
		</tr>
		<tr> 
			<td>identificationNumber</td>
			<td>String</td>
			<td>识别号：用来区别每次请求</td>
		</tr>
		<tr> 
			<td>weixin_oa_appid</td>
			<td>String</td>
			<td>微信公众号应用唯一标识</td>
		</tr>
		<tr> 
			<td>fileStorageSystem</td>
			<td>int</td>
			<td>文件存储系统 0.本地系统 10.SeaweedFS 20.MinIO 30.阿里云OSS</td>
		</tr>
		
		
	</tbody> 
</table>
<table id="anchor_40" class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="4">用户 AccessUser</th>
		</tr> 
		<tr> 
			<th width="30%">变量</th> 
			<th width="30%">类型</th>
			<th width="40%" colspan="2">说明</th> 
		</tr> 
	</thead> 
	<tbody> 
		<tr> 
			<td>id</td> 
			<td>long</td>
			<td colspan="2">Id</td>
		</tr>
		<tr> 
			<td>userName</td> 
			<td>String</td>
			<td colspan="2">会员用户名</td>
		</tr>
		<tr> 
			<td>account</td> 
			<td>String</td>
			<td colspan="2">账号</td>
		</tr>
		<tr> 
			<td>nickname</td> 
			<td>String</td>
			<td colspan="2">呢称</td>
		</tr>
		<tr> 
			<td>avatarPath</td> 
			<td>String</td>
			<td>头像路径</td>
			<td width="15%" rowspan="2">页面上显示200*200头像示例${accessUser.avatarPath}${accessUser.avatarName}   &nbsp;&nbsp;显示100*100头像示例${accessUser.avatarPath}100x100/${accessUser.avatarName}</td> 
		</tr>
		<tr> 
			<td>avatarName</td> 
			<td>String</td>
			<td>头像名称</td>
		</tr>
		<tr> 
			<td>openId</td> 
			<td>String</td>
			<td colspan="2">第三方用户的唯一标识 例如微信的openid</td>
		</tr>
		<tr> 
			<td>loginInterface</td> 
			<td>Integer</td>
			<td colspan="2">登录接口 0.本地 10.微信 50.其他开放平台</td>
		</tr>
	</tbody> 
</table>


<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">模板引擎内置函数</th>
		</tr> 
		<tr> 
			<th width="20%"></th>
			<th width="30%">参数</th>
			<th width="50%">说明</th> 
		</tr> 
	</thead> 
	<tbody> 
		<tr> 
			<td rowspan="6">
				List集合
			</td> 
			<td>
				&lt#list sequence as item>
					<br>
				&lt/#list>
			</td> 
			<td>遍历集合</td>
		</tr>
		<tr> 
			<td>
				${item_index}<br>
			</td> 
			<td>当前迭代项在所有迭代项中的位置</td>
		</tr>
		<tr> 
			<td>
				${item_has_next}<br>
			</td> 
			<td>用于判断当前迭代项是否是所有迭代项中的最后一项</td>
		</tr>
		<tr> 
			<td>sequence?first</td>
			<td>获取集合第一个元素</td>
		</tr>
		<tr> 
			<td>sequence?last</td> 
			<td>获取集合最后一个元素</td>
		</tr>
		<tr> 
			<td>
				sequence?size
			</td> 
			<td>获取队列长度</td>
		</tr>
		
		<tr> 
			<td rowspan="5">
				Map集合
			</td> 
			<td>
				&lt#list hash as key, value>
					<br>
				&lt/#list>
			</td> 
			<td>遍历集合</td>
		</tr>
		<tr> 
			<td>
				${key}<br>
			</td> 
			<td>获取集合的键</td>
		</tr>
		<tr> 
			<td>
				${value}<br>
			</td> 
			<td>获取集合的值</td>
		</tr>
	</tbody> 
</table>
<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">模板引擎比较符号</th>
		</tr> 
		<tr> 
			<th width="30%">参数</th>
			<th width="70%">说明</th> 
		</tr> 
	</thead> 
	<tbody> 
		<tr> 
			<td>lt</td>
			<td>小于( &lt )</td>
		</tr>
		<tr> 
			<td>gt</td> 
			<td>大于( &gt )</td>
		</tr>
		<tr> 
			<td>lte</td> 
			<td>小于或等于( &lt= )</td>
		</tr>
		<tr> 
			<td>gte</td> 
			<td>大于或等于( >= )</td>
		</tr>
		
	</tbody> 
</table>
<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">模板引擎判断空值</th>
		</tr> 
		<tr> 
			<th width="30%">参数</th>
			<th width="20%">说明</th> 
			<th width="50%">示例</th> 
		</tr> 
	</thead> 
	<tbody> 
		<tr> 
			<td>??</td>
			<td>空值判断</td>
			<td align="left" >
				<textarea name="exampleCode">
					变量name判断是否为空
					&lt#if name??>
						有值
					&lt#else>
						没有值
					&lt/#if>
				</textarea>
				
				
					当服务器返回Map变量时不能先定义变量再判断,例如<br>
				<span style="text-decoration:line-through;">
					&lt#assign error = returnValue['error']><br>
					&lt#if error?? && error?size gt 0><br>
						&lt#list returnValue['error'] as key, value> <br>
						    ${value} <br>
						&lt/#list> <br>
					&lt#else><br>
						没有可以领取的优惠券<br>
					&lt/#if><br>
					</span>
					以上的写法会抛出错误
				
				<textarea name="exampleCode">
					正确的写法是拿返回值直接判断 如下：
					&lt#if returnValue['error']?? && returnValue['error']?size gt 0>
						&lt#list returnValue['error'] as key, value> 
						    ${value} 
						&lt/#list> 
					&lt#else>
						没有可以领取的优惠券
					&lt/#if>
				</textarea>
			</td>
		</tr>
		<tr> 
			<td>?size</td> 
			<td>集合大小判断</td>
			<td align="left">
				<textarea name="exampleCode">
					<textarea name="exampleCode">
					&lt#if returnValue['error']?? && returnValue['error']?size gt 0>
						&lt#list returnValue['error'] as key, value> 
						    ${value} 
						&lt/#list> 
					&lt#else>
						没有可以领取的优惠券
					&lt/#if>
				</textarea>
				</textarea>
			</td>
		</tr>
		
	</tbody> 
</table>

<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">Ajax方式请求/返回 处理</th>
		</tr> 
		<tr> 
			<th width="20%"></th>
			<th width="30%">参数</th>
			<th width="50%">说明</th> 
		</tr> 
	</thead> 
	<tbody> 
		<tr> 
			<td rowspan="1">
				请求
			</td> 
			<td>
				自定义请求头 协议头：X-Requested-With  值：XMLHttpRequest
			</td> 
			<td>
				zepto.js和jquery.js等前端框架默认包含此参数
				<textarea name="exampleCode">
					xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");
				</textarea>
			</td>
		</tr>
		<tr> 
			<td rowspan="4">
				返回
			</td> 
			<td>
				400状态码
			</td> 
			<td>表示请求错误</td>
		</tr>
		<tr> 
			<td>
				403状态码<br>
			</td> 
			<td>权限不足</td>
		</tr>
		<tr> 
			<td>
				508状态码<br>
			</td> 
			<td>服务器处理请求时检测到一个无限循环。当用户未登陆时在登录页面/login使用Ajax请求/user/开头的URL,会出现此错误</td>
		</tr>
		<tr> 
			<td>
				响应头jumpPath<br>
			</td> 
			<td>
				值为登录页路径。未登录时访问登录页面会返回此参数值
				<textarea name="exampleCode">
					xhr.getResponseHeader("jumpPath")
				</textarea>
			</td>
		</tr>
	</tbody> 
</table>

<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">移动端统计访问量</th>
		</tr> 
	</thead> 
	 <tbody> 
	 	<tr> 
			<td>请求路径</td> 
			<td colspan="2">statistic/add.htm</td>
		</tr>
		<tr> 
			<td>请求方式</td> 
			<td colspan="2">GET</td>
		</tr> 
		<tr> 
			<td rowspan="2">请求参数</td> 
			<td>当前访问页面URL</td> 
			<td>
				变量：url<br>
				类型：String<br>
				是否必填：是
			</td>
		</tr>
		<tr> 
			<td>上一访问页面URL</td> 
			<td>
				变量：referrer<br>
				类型：String<br>
				是否必填：否
			</td>
		</tr>
		<tr> 
			<td width="30%" >提交返回</td> 
			<td width="30%" >空字符串</td>
			<td width="40%"></td> 
		</tr>
	</tbody> 
</table>

<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">获取短信验证码 - AJAX方式</th>
		</tr> 
	</thead> 
	 <tbody> 
	 	<tr> 
			<td>请求路径</td> 
			<td colspan="2">smsCode.htm</td>
		</tr>
		<tr> 
			<td>请求方式</td> 
			<td colspan="2">POST</td>
		</tr> 
		<tr> 
			<td>自定义请求头</td> 
			<td colspan="2">协议头：X-Requested-With  值：XMLHttpRequest</td>
		</tr>
		<tr> 
			<td>请求参数</td> 
			<td colspan="2"><a style="color: #317ee7" onclick="anchorJump('#anchor_500'); return false;">参数表</a></td>
		</tr>
		<tr> 
			<td width="30%" rowspan="3">提交返回</td> 
			<td width="30%" rowspan="3">JSON格式值 类型:Map&ltString,Object></td>
			<td width="40%">键参数：success<br>值内容说明：成功返回true 失败返回false<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：error<br>值内容说明：错误值集合<br>值类型：<a style="color: #317ee7" onclick="anchorJump('#anchor_80'); return false;">Map&ltString,String></a></td> 
		</tr>
		<tr> 
			<td>键参数：captchaKey<br>值内容说明：验证码编号 success为false时有值</td> 
		</tr>
	</tbody> 
</table>
<table id="anchor_500" class="exampleTable" > 
	<thead>
		<tr> 
			<th colspan="4">提交'获取短信验证码'参数</th>
		</tr>
		<tr> 
			<th width="30%">参数</th> 
			<th width="20%">类型</th> 
			<th width="10%">是否必填</th> 
			<th width="40%">说明</th> 
		</tr> 
	</thead> 
	 <tbody>
	 	<tr> 
			<td>mobile</td> 
			<td>String</td>
			<td>是</td>
			<td>手机号</td>
		</tr>
		<tr> 
			<td>module</td> 
			<td>String</td>
			<td>是</td>
			<td>模块 100.注册  200.登录 300.找回密码</td>
		</tr>
		<tr> 
			<td>captchaKey</td> 
			<td>String</td>
			<td>是</td>
			<td>验证码编号</td> 
		</tr>
		<tr>
			<td>captchaValue</td> 
			<td>String</td>
			<td>是</td>
			<td>验证码值 同一编号验证码每分钟提交次数不能超过60次,超出时验证码图片返回空字符</td> 
		</tr>
		<tr> 
			<td>token</td> 
			<td>String</td>
			<td>是</td>
			<td>令牌</td> 
		</tr>
	</tbody> 
</table>
<table id="anchor_80"  class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">获取短信验证码 错误值 error</th>
		</tr> 
		<tr> 
			<th width="30%">变量</th> 
			<th width="30%">类型</th>
			<th width="40%">说明</th> 
		</tr> 
	</thead> 
	 <tbody> 
	 	<tr> 
			<td>token</td> 
			<td>String</td>
			<td>令牌错误</td>
		</tr>
		<tr> 
			<td>captchaValue</td> 
			<td>String</td>
			<td>验证码错误</td>
		</tr>
		<tr> 
			<td>mobile</td> 
			<td>String</td>
			<td>手机号</td>
		</tr>
		<tr> 
			<td>smsCode</td> 
			<td>String</td>
			<td>手机验证码</td>
		</tr>
		<tr> 
			<td>message</td> 
			<td>String</td>
			<td>获取短信验证码</td>
		</tr>
	</tbody> 
</table>



<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">基本信息</th>
		</tr> 
	</thead> 
	 <tbody> 
	 	<tr> 
			<td>请求路径</td> 
			<td colspan="2">baseInfo.htm</td>
		</tr>
		<tr> 
			<td>请求方式</td> 
			<td colspan="2">GET</td>
		</tr> 
		<tr> 
			<td width="30%" rowspan="12">提交返回</td> 
			<td width="30%" rowspan="12">JSON格式值 类型:Map&ltString,Object></td>
			<td width="40%">键参数：title<br>值内容说明：站点名称<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：keywords<br>值内容说明：站点关键词<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：description<br>值内容说明：站点描述<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：baseURL<br>值内容说明：系统路径<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：commonPath<br>值内容说明：资源路径<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：contextPath<br>值内容说明：系统虚拟目录<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：templateDir<br>值内容说明：模板目录名称<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：systemUser<br>值内容说明：登录用户<br>值类型：<a style="color: #317ee7" onclick="anchorJump('#anchor_40'); return false;">AccessUser</a></td> 
		</tr>
		<tr> 
			<td>键参数：baseURI<br>值内容说明：系统资源标识符<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：fileStorageSystem<br>值内容说明：文件存储系统 0.本地系统 10.SeaweedFS 20.MinIO 30.阿里云OSS<br>值类型：Integer</td> 
		</tr>
		<tr> 
			<td>键参数：supportAccessDevice<br>值内容说明：支持访问设备 1.自动识别终端 2.电脑端 3.移动端<br>值类型：Integer</td> 
		</tr>
    	<tr> 
			<td>键参数：weixin_oa_appid<br>值内容说明：微信公众号appid<br>值类型：String</td> 
		</tr>

	</tbody> 
</table>

<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">会话续期</th>
		</tr> 
	</thead> 
	 <tbody> 
	 	<tr> 
			<td>请求路径</td> 
			<td colspan="2">refreshToken.htm</td>
		</tr>
		<tr> 
			<td>请求方式</td> 
			<td colspan="2">POST</td>
		</tr> 
		<tr> 
			<td width="30%" rowspan="11">提交返回</td> 
			<td width="30%" rowspan="11">JSON格式值 类型:Map&ltString,Object></td>
			<td width="40%">键参数：accessToken<br>值内容说明：访问令牌<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：refreshToken<br>值内容说明：刷新令牌<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：systemUser<br>值内容说明：登录用户<br>值类型：<a style="color: #317ee7" onclick="anchorJump('#anchor_40'); return false;">AccessUser</a></td> 
		</tr>
	</tbody> 
</table>

<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">恢复微信浏览器会话</th>
		</tr> 
	</thead> 
	 <tbody> 
	 	<tr> 
			<td>请求路径</td> 
			<td colspan="2">recoverWeChatBrowserSession.htm</td>
		</tr>
		<tr> 
			<td>请求方式</td> 
			<td colspan="2">POST</td>
		</tr> 
		<tr> 
			<td width="30%" rowspan="11">提交返回</td> 
			<td width="30%" rowspan="11">JSON格式值 类型:Map&ltString,Object></td>
			<td width="40%">键参数：accessToken<br>值内容说明：访问令牌<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：refreshToken<br>值内容说明：刷新令牌<br>值类型：String</td> 
		</tr>
		<tr> 
			<td>键参数：systemUser<br>值内容说明：登录用户<br>值类型：<a style="color: #317ee7" onclick="anchorJump('#anchor_40'); return false;">AccessUser</a></td> 
		</tr>
		<tr> 
			<td>键参数：openId<br>值内容说明：用户的唯一标识 每个用户对每个公众号的OpenID是唯一的。对于不同公众号，同一用户的openid不同<br>值类型：String</td> 
		</tr>
	</tbody> 
</table>


<table class="exampleTable" > 
	<thead> 
		<tr> 
			<th colspan="3">注意事项</th>
		</tr> 
	</thead> 
	<tbody> 
		<tr> 
			<td>JavaScript提交参数除密码框值外建议都用encodeURIComponent()函数进行编码</td>
		</tr>
		<tr> 
			<td>因为JavaScript中的数字类型不能包含所有的java long值,所以JSON返回值中含有Long都转为String类型</td> 
		</tr>
		<tr> 
			<td>Freemarker模板不支持直接输出布尔类型(boolean),布尔类型对象输出要使用内建函数c将布尔值转换为字符串；例如布尔类型${formCaptcha.showCaptcha}要写成${formCaptcha.showCaptcha?c}才能正确显示；比较${formCaptcha.showCaptcha?c == 'true'}</td> 
		</tr>
		<tr> 
			<td>因为手机版采用单页应用设计,框架不支持加上网页后缀,建议电脑版网页链接不要加上后缀(.htm)，让手机版和网页版URL保持一致</td>
		</tr>
		<tr> 
			<td>前后端分离模板使用localStorage存储Token时，ajax发送header需要加上Authorization属性验证权限，值格式为“Bearer 访问令牌,刷新令牌”。例如：Authorization: Bearer a7f9ffe9b01c467ea9b1dccfcf5e6951,1024d6e2c9394b489d384a5867620a07</td>
		</tr>
	</tbody> 
</table>

